#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <cerrno>
#include <cstdio>
#include <cstring>

using namespace std;

// 通用设置文件为非阻塞的方式
// 还有很多其他方式
void set_nonblock(int fd) {
    int flag = fcntl(fd, F_GETFL);
    if(flag == -1) {
        perror("Failed to set flag");
    }
    if (fcntl(fd, F_SETFL, flag | O_NONBLOCK) == -1) {  
        perror("fcntl F_SETFL");  
        return;  
    }
}

int main() {
    char buff[1024];
    set_nonblock(0);
    while(true) {
        ssize_t n = read(0, buff, sizeof(buff) - 1);
        if(n > 0) {
            buff[n - 1] = '\0';
            cout << "echo " << buff << endl;
        }
        else if(n == 0) {
            // 读到文件末尾
            cout << "EOF" << endl;
            break;
        }
        else {
            // 设置为非阻塞后，返回-1可能是读文件出错，也可能是数据不就绪
            // 通过错误码errno来判断

            // 资源不就绪
            if(errno == EWOULDBLOCK) {
                cout << "data is not available, please try again" << endl;
                // do_something();
                sleep(1);
            }
            else {
                perror("read");
                break;
            }
            // todo 信号io？
        }
    }
    return 0;
}